# -*- coding: utf-8 -*-


import sys, os, time, thread, os.path, threading
from PyQt4 import QtCore, QtGui
from liburl import DownloadThread
from noplatform import *
from fonk import VERSION, byte, html_yaz, dogrulama, mesaj


arguman = sys.argv

class XmlToPDX(QtCore.QThread):
    def __init__(self, ui):
        QtCore.QThread.__init__(self)
        self.ui = ui
        
    def run(self):
        pisiIndex = getFreshPiSiIndex(self.ui.xmlfile)
        writeUpdatedPackages(self.ui.xmlfile, pisiIndex)

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.resize(400, 150)
        self.setMinimumSize(400, 150)
        self.setMaximumSize(400, 150)
        self.setWindowIcon(QtGui.QIcon("odun.png"))
        self.cw = QtGui.QWidget(self)
        self.gridLayout = QtGui.QGridLayout(self.cw)
        self.konum = QtGui.QLabel(self.cw)
        self.gridLayout.addWidget(self.konum, 0, 0, 1, 1)
        self.url = QtGui.QLabel(self.cw)
        self.gridLayout.addWidget(self.url, 0, 1, 1, 4)
        self.pisi = QtGui.QLabel(self.cw)
        self.gridLayout.addWidget(self.pisi, 1, 0, 1, 1)
        self.paket = QtGui.QLabel(self.cw)
        self.gridLayout.addWidget(self.paket, 1, 1, 1, 4)
        self.progressBar = QtGui.QProgressBar(self.cw)
        self.progressBar.setProperty("value", 0)
        self.gridLayout.addWidget(self.progressBar, 2, 0, 1, 8)
        self.indir = QtGui.QPushButton(self.cw)
        self.indir.setEnabled(False)
        self.gridLayout.addWidget(self.indir, 3, 0, 1, 2)
        self.pisixmlac = QtGui.QPushButton(self.cw)
        self.gridLayout.addWidget(self.pisixmlac, 3, 2, 1, 2)
        self.iptal = QtGui.QPushButton(self.cw)
        self.iptal.setEnabled(False)
        self.gridLayout.addWidget(self.iptal, 3, 4, 1, 2)
        self.kapat = QtGui.QPushButton(self.cw)
        self.gridLayout.addWidget(self.kapat, 3, 6, 1, 2)
        self.Boyut = QtGui.QLabel(self.cw)
        self.gridLayout.addWidget(self.Boyut, 1, 5, 1, 1)
        self.boyut = QtGui.QLabel(self.cw)
        self.gridLayout.addWidget(self.boyut, 1, 6, 1, 2)
        self.kalansure = QtGui.QLabel(self.cw)
        self.gridLayout.addWidget(self.kalansure, 0, 5, 1, 1)
        self.sure = QtGui.QLabel(self.cw)
        self.gridLayout.addWidget(self.sure, 0, 6, 1, 2)
        self.durum = QtGui.QLabel(self.cw)
        self.gridLayout.addWidget(self.durum, 4, 0, 1, 8)
        
        self.setCentralWidget(self.cw)
        
        self.menubar = QtGui.QMenuBar(self)
        self.mDosya = QtGui.QMenu(self.menubar)
        self.mYardim = QtGui.QMenu(self.menubar)
        self.mDuzenle = QtGui.QMenu(self.menubar)
        self.setMenuBar(self.menubar)
        self.aKapat = QtGui.QAction(self)
        self.aKullanimKlavuzu = QtGui.QAction(self)
        self.aHakkinda = QtGui.QAction(self)
        self.aQtHakkinda = QtGui.QAction(self)
        self.aPDZOlustur = QtGui.QAction(self)
        self.aPDZOlustur.setEnabled(False)
        self.mDosya.addAction(self.aKapat)
        self.mYardim.addAction(self.aKullanimKlavuzu)
        self.mYardim.addSeparator()
        self.mYardim.addAction(self.aHakkinda)
        self.mYardim.addAction(self.aQtHakkinda)
        self.mDuzenle.addAction(self.aPDZOlustur)
        self.menubar.addAction(self.mDosya.menuAction())
        self.menubar.addAction(self.mDuzenle.menuAction())
        self.menubar.addAction(self.mYardim.menuAction())

        self.retranslateUi()

        QtCore.QObject.connect(self.aHakkinda, QtCore.SIGNAL("triggered(bool)"), self.hakkinda)
        QtCore.QObject.connect(self.aKapat, QtCore.SIGNAL("triggered(bool)"), self.close)
        QtCore.QObject.connect(self.aKullanimKlavuzu, QtCore.SIGNAL("triggered(bool)"), self.klavuz)
        QtCore.QObject.connect(self.aQtHakkinda, QtCore.SIGNAL("triggered(bool)"), QtGui.QApplication.aboutQt)
        QtCore.QObject.connect(self.aPDZOlustur, QtCore.SIGNAL("triggered(bool)"), self.PDZolustur)

        QtCore.QObject.connect(self.kapat, QtCore.SIGNAL("clicked(bool)"), self.close)
        QtCore.QObject.connect(self.pisixmlac, QtCore.SIGNAL("clicked(bool)"), self.xmlac)
        QtCore.QObject.connect(self.indir, QtCore.SIGNAL("clicked(bool)"), self._indirpisi)
        QtCore.QObject.connect(self.iptal, QtCore.SIGNAL("clicked(bool)"), self.iptalet)
        
        self.pisiindir = ""
        self.timer = QtCore.QBasicTimer()
        try:
            if os.path.isfile(arguman[1]):
                self.xmlfile = arguman[1]
                self.pisixmlac.setEnabled(False)
                #self.iptal.setEnabled(True)
                self.indir.setEnabled(True)
                yol, xmlname = os.path.split(self.xmlfile)
                self.setWindowTitle(u"Odun Downloader - "+xmlname)
                
                print "Bu bir dosya"
            else:
                print "Bu bir dosya değil"
                sys.exit()
        except IndexError:
            print "Arguman yok"

        self.hatalipaketler = []
    
    def hakkinda(self):
        mesajk = QtGui.QMessageBox.about(self.cw, u"Odun Hakkında", mesaj)
    
    def klavuz(self):
        pass
    
    def PDZolustur(self):
        pass
        
    def iptalet(self):
        if self.timer.isActive():
            self.timer.stop()
            self.pisiindir.cancel()
            self.indir.setEnabled(True)
            self.progressBar.setValue(self.pisiindir.percentage())
        #self.iptal.setEnabled(False)
        self.kapat.setEnabled(True)
        self.aKapat.setEnabled(True)
        self.indir.setEnabled(False)
        self.pisixmlac.setEnabled(True)
    
    
    def _indirpisi(self):
        thread.start_new_thread(self.indirpisi, ())
        while type("") == type(self.pisiindir):
            pass
        self.timer.start(200, self)
        
    def indirpisi(self):
        #self.iptal.setEnabled(True)
        #self.kapat.setEnabled(False)
        #self.aKapat.setEnabled(False)
        self.indir.setEnabled(False)
        self.pisixmlac.setEnabled(False)

        pdx = readPDX(self.xmlfile)

        lenPDX = len(pdx)
        count = 0
        self.bilgi = []
        self.detay = open("detay.txt","a")
        for pisi in pdx:
            count = count + 1
            self.durum.setText("")
            url, pisiname = os.path.split(pisi["url"])
            xmlname = pisi["url"].split("/")
            self.pisiindir = DownloadThread(pisi["url"])
            self.pisiindir.start()
            self.url.setText(xmlname[-2])
            self.downloadInfo = "%s - %s/%s"%(pisi["name"], count, lenPDX)
            self.paket.setText(self.downloadInfo)
            self.boyut.setText(byte(self.pisiindir.getSize()))
            
            app.processEvents()
            # download bitene kadar bekle
            while self.pisiindir.percentage() < 100:
                pass
            
            self.durum.setText(u"Kontrol ediliyor...")
            time.sleep(1)
            dogrumu = dogrulama(xmlname[-1],pisi["hash"])
            if dogrumu == True:
                self.durum.setText(u"Başarılı indirme!")
                time.sleep(1)
                self.detay.write(pisi["name"]+" paketi başarıyla indirildi!\n")
            else:
                self.durum.setText(u"Hatalı indirme!")
                self.hatalipaketler.append(pisi)
                time.sleep(1)
                self.detay.write(pisi["name"]+" paketi hatalı olarak indirildi! Paket silindi...\n")
                if sys.platform == "win32":
                    os.remove(os.getcwd()+"\\packages\\%s"%xmlname[-1])
                else:
                    os.remove(os.getcwd()+"/packages/%s"%xmlname[-1])
                self.bilgi.append((pisi["name"],pisi["url"]))
            if count == lenPDX:
                self.durum.setText(u"İndirmeler Tamamlandı.\n")
                self.detay.write("İşlem sonu...")
        self.detay.close()
        if len(self.bilgi) == 0:
            pass
        else:
            self.durum.setText(u"%d hatalı paket yazılımın kurulduğu dizinde \n\"hatalipaketler.html\" olarak kaydedildi."%len(self.bilgi))
            #sinyalle uyari fonk. çalıştırmalı
            pass
        #self.iptal.setEnabled(False)
        self.pisixmlac.setEnabled(True)
        #self.kapat.setEnabled(True)
        #self.aPDZOlustur.setEnabled(True)
        self.timer.stop()

    def uyari(self):
        htmlyaz = html_yaz(self.bilgi)
        mesaj = u"""%d hatalı paket yazılımın kurulduğu \ndizinde "hatalipaketler.html" olarak kaydedildi.\n html dosyasından tarayıcınızla indirebilirsiniz."""%say
        uyar = QtGui.QMessageBox()
        uyar.setWindowTitle(u"Uyarı!")
        uyar.setText(mesaj)
        uyar.exec_()

    def xmlac(self):
        self.xmlfile = QtGui.QFileDialog.getOpenFileName(self, u"Odun Dosyası", QtCore.QDir.homePath(), u"Odun dosyası(*.pdx);; Yüklenmiş Pisi Listesi (*.xml)")
        if os.path.isfile(self.xmlfile) == True:
            if self.xmlfile[-3:] == "xml":
                mesaj = u"""XML-PDX Dönüşümü sistemizi oldukça etkiler!\nDevam Etmek İstiyor musunuz?"""
                reply = QtGui.QMessageBox.question(self, u"Uyarı!", mesaj, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
                if reply == QtGui.QMessageBox.Yes:
                    xmltopdx = XmlToPDX(self)
                    xmltopdx.start()
                    xmltopdx.wait(1)
                    self.xmlfile = "updates.pdx"
                    QtCore.QObject.connect(xmltopdx, QtCore.SIGNAL("finished()"), self.xmlac2)
                else:
                    pass
            self.xmlac2()
        else:
            uyar = QtGui.QMessageBox()
            uyar.setWindowTitle(u"Uyarı")
            uyar.setText(u"Dosya seçmediniz!")
            uyar.exec_()
            self.indir.setEnabled(False)
            #self.iptal.setEnabled(False)
            self.setWindowTitle("Odun Downloader")
    
    def xmlac2(self):
        self.indir.setEnabled(True)
        #self.iptal.setEnabled(True)
        xmlname = self.xmlfile.split("/")
        self.setWindowTitle("Odun Downloader - "+xmlname[-1])
    
    def retranslateUi(self):
        self.setWindowTitle(u"Odun Downloader")
        self.konum.setText(u"Konum:")
        self.url.setText(u"")
        self.pisi.setText(u"Pisi:")
        self.paket.setText(u"")
        self.progressBar.setFormat("%%p")
        self.indir.setText(u"İndir")
        self.pisixmlac.setText(u"Dosya aç")
        self.iptal.setText(u"İptal")
        self.kapat.setText(u"Kapat")
        self.Boyut.setText(u"Boyut:")
        self.boyut.setText(u"")
        self.kalansure.setText(u"Kalan Süre:")
        self.sure.setText(u"")
        self.durum.setText(u"")
        self.mDosya.setTitle(u"Dosya")
        self.mYardim.setTitle(u"Yardım")
        self.mDuzenle.setTitle(u"Düzenle")
        self.aKapat.setText(u"Kapat")
        self.aKullanimKlavuzu.setText(u"Kullanım Klavuzu")
        self.aHakkinda.setText(u"Odun Hakkında")
        self.aQtHakkinda.setText(u"Qt Hakkında")
        self.aPDZOlustur.setText(u"PDZ Oluştur")

    def timerEvent(self, event):
        if self.pisiindir.percentage() >= 100.0:
            self.progressBar.setValue(100.0)
            self.sure.setText("00:00:00")
            return
        self.progressBar.setValue(self.pisiindir.percentage())
        self.sure.setText(self.pisiindir.elapsedTime())

    def closeEvent(self, event):
        if self.timer.isActive() == True:
            reply = QtGui.QMessageBox.question(self, u"Mesaj",
            u"Kapatmak istiyor musunuz?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

            if reply == QtGui.QMessageBox.Yes:
                event.accept()
            else:
                event.ignore()
            
        else:
            event.accept()


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    ui = MainWindow()
    ui.show()
    sys.exit(app.exec_())
